package main

import (
	"fmt"
	"reflect"
	"unsafe"
)

type User struct {
	Name string
	code int
}
/**
Value.Pointer 和Value.Int等方法类似，将Value.data储存的数据转换为指针，目标必须是指针类型，
然而Unsafe返回任何CanAddr Value.data地址(相当于&去地址操作),比如Elem后的Value，以及字段成员地址。
以结构体里的指针类型字段为例，Pointer返回该字段所保存的地址，
而UnsafeAddr返回该字段自身的地址(结构对象地址+偏移量)
 */
func main() {
	p := new(User)
	v := reflect.ValueOf(p).Elem()

	name := v.FieldByName("Name")
	code := v.FieldByName("code")
	fmt.Printf("name : canaddr =%v,canset = %v \n",name.CanSet(),name.CanSet())
	fmt.Printf("code : canaddr =%v,canset = %v \n",code.CanSet(),code.CanSet())

	if name.CanSet() {
		name.SetString("Tom")
	}
	if code.CanAddr() {
		*(*int)(unsafe.Pointer(code.UnsafeAddr())) = 100
	}
	fmt.Printf("%+v\n",*p)
}